package com.zty.redis.util;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * @Author ZTY
 * @Description 取Spring容器中的整体的Context对象
 * 它用于在非Spring管理的类中获取Spring容器（上下文）及其管理的bean。
 *
 * 这个类实现了 ApplicationContextAware 接口，
 * 这是Spring提供的一种方式，允许对象通过回调方式获取到它们所在的 ApplicationContext。
 *
 * @Date 3:59 2023-12-13
 **/


@Component
public class SpringContextUtil implements ApplicationContextAware {

    // 声明一个静态变量来持有ApplicationContext的引用
    // 使用静态变量，可以在任何时候，通过SpringContextUtil类直接访问ApplicationContext
    private static ApplicationContext applicationContext;

    // 实现ApplicationContextAware接口必须实现的方法
    // 当一个类实现了这个接口后，Spring容器在创建这个类的实例时，
    // 会自动调用这个方法，注入ApplicationContext对象
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        // 将传入的ApplicationContext赋值给静态变量
        // 这样在这个类的其他静态方法中就可以使用这个ApplicationContext了
        SpringContextUtil.applicationContext = applicationContext;
    }

    // 提供一个公共的静态方法，用于获取ApplicationContext对象
    // 任何时候都可以通过SpringContextUtil.getApplicationContext()来获取它
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    // 提供一个公共的静态方法，用于根据类型获取Spring容器中的bean
    // 这个方法简化了从ApplicationContext中获取bean的操作
    public static Object getBean(Class type) {
        return applicationContext.getBean(type);
    }
}